package com.example.softwareconfigurationcoursedesign.LoginRegister;

import com.example.softwareconfigurationcoursedesign.Admin.MD5Encryption;
import jakarta.servlet.ServletContext;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

@WebServlet(name = "Servlet", value = "/Servlet")
public class Servlet extends HttpServlet {
    // 重写 doPost 方法，处理 HTTP POST 请求
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 设置响应内容类型为 HTML，并指定字符集为 utf-8
        response.setContentType("text;charset=utf-8");
        // 获取请求中的参数 phoneNumber2 和 password2
        String phoneNum = request.getParameter("phoneNumber2");
        String userPassword = request.getParameter("password2");

        // 加密密码
        String encryptedPassword = MD5Encryption.encryptStringToMD5(userPassword);

        // 再次设置响应内容类型为 HTML，并指定字符集为 utf-8（重复设置，可能是多余的）
        response.setContentType("text/html;charset=utf-8");
        // 获取 ServletContext 对象
        ServletContext context = this.getServletContext();
        // 从 ServletContext 中获取数据库相关的初始化参数
        String dbUrl = context.getInitParameter("DatabaseUrl");
        String dbUsername = context.getInitParameter("DatabaseUsername");
        String dbPassword = context.getInitParameter("DatabasePassword");
        String jdbcDriver = context.getInitParameter("jdbcDriver");
        // 在控制台输出 phoneNum 和 userPassword
        System.err.println(phoneNum);
        System.err.println(userPassword);
        // 如果用户名为 "admin" 且密码为 "admin"，重定向到 AdminWelcome.html 页面
        if (phoneNum.equals("admin") && (userPassword.equals("admin"))) {
            response.sendRedirect("HTML/AdminWelcome.html");
        } else {
            try (Connection connection = DatabaseUtil.getCon(jdbcDriver, dbUrl, dbUsername, dbPassword);
                 PreparedStatement pst = connection.prepareStatement("select * from users where phone_number=?")) {
                // 设置查询参数
                pst.setString(1, phoneNum);
                try (ResultSet rs = pst.executeQuery()) {
                    if (rs.next()) {
                        String Password = rs.getString("password");
                        if (encryptedPassword.equals(Password)) {
                            // 如果密码匹配，记录登录日志并重定向到 TransitionInterface.jsp 页面
                            log("登录");
                            // 获取会话对象（如果不存在则创建新会话）
                            HttpSession session = request.getSession();
                            // 将用户信息存储在会话属性中
                            session.setAttribute("loggedInUser", phoneNum);
                            response.sendRedirect("TransitionInterface.jsp");
                        } else {
                            PrintWriter out = response.getWriter();
                            // 输出 JavaScript 脚本，提示登录失败，并返回到 LoginRegisterPage.jsp 页面
                            out.println("<script>alert('登录失败 将返回主页面  请您再次尝试进行登录'); window.location.href='LoginRegisterPage.jsp';</script>");
                            out.flush();
                        }
                    } else {
                        PrintWriter out = response.getWriter();
                        // 输出 JavaScript 脚本，提示登录失败，并返回到 LoginRegisterPage.jsp 页面
                        out.println("<script>alert('登录失败 将返回主页面  请您再次尝试进行登录'); window.location.href='LoginRegisterPage.jsp';</script>");
                        out.flush();
                    }
                }
            } catch (SQLException | IOException throwable) {
                // 捕获并处理 SQL 异常或 I/O 异常，并记录到日志中，然后重定向到 error.html 页面
                Logger.getLogger(Servlet.class.getName()).log(Level.SEVERE, "数据库操作失败", throwable);
                response.sendRedirect("error.html");
            }
        }
    }
}